/*
Char 是一个 “Unicode 标量值”，它是除代理代码点之外的任何 “Unicode 字符”。
这有一个固定的数值定义： 代码点在 0 到 0x10FFFF 的范围内，包括。UTF-16 使用的代理代码点在 0xD800 到 0xDFFF 范围内。
不能构造非 Unicode 标量值的字符，无论是字面值还是运行时字符。违反这条规则会引起未定义行为。
*/
use std::any::type_name_of_val;

#[test]
fn charx() {
    let c: char = 'a';
    let d = match c {
        '\0'..='\u{D7FF}' => 0,
        '\u{E000}'..='\u{10FFFE}' => 1, //end is '\u{10FFFF}'
        _ => 2,
    };
    println!("{} {}", c, type_name_of_val(&c));
    println!("{}", d);
}
#[test]
fn with_u32() {
    use std::alloc::Layout;
    assert_eq!(Layout::new::<char>(), Layout::new::<u32>());
}
/*
Char 的大小总是 4 个字节。这与给定字符作为 String 的一部分所具有的表示形式不同
*/
#[test]
fn size() {
    let v = vec!['h', 'e', 'l', 'l', 'o'];
    println!("char size:{}", std::mem::size_of::<char>());
    // five elements times four bytes for each element
    assert_eq!(20, v.len() * std::mem::size_of::<char>());

    let s = String::from("hello");

    // five elements times one byte per element
    assert_eq!(5, s.len() * std::mem::size_of::<u8>());
}

/*
人类对 “字符” 的直觉可能不会映射到 Unicode 的定义。例如，尽管看起来很相似，‘ é’字符是一个 Unicode 字符，而‘ é’是两个 Unicode 编码点
*/
#[test]
fn char() {
    let mut chars = "é".chars();
    println!("{:?}", chars);
    // U+00e9: 'latin small letter e with acute'
    assert_eq!(Some('\u{00e9}'), chars.next());
    assert_eq!(None, chars.next());

    let mut chars = "é".chars();
    // U+0065: 'latin small letter e'
    assert_eq!(Some('\u{0065}'), chars.next());
    // U+0301: 'combining acute accent'
    assert_eq!(Some('\u{0301}'), chars.next());
    assert_eq!(None, chars.next());
}

#[test]
fn more_mem() {
    let s = String::from("love: ❤️");
    let v: Vec<char> = s.chars().collect();

    assert_eq!(24, std::mem::size_of_val(&s));
    assert_eq!(24, std::mem::size_of_val(&v));
    assert_eq!(12, std::mem::size_of_val(&s[..]));
    assert_eq!(32, std::mem::size_of_val(&v[..]));
}

#[test]
fn ad() {
    let dist = u32::from(char::MAX) - u32::from(char::MIN);
    let size = (char::MIN..=char::MAX).count() as u32;
    assert!(size < dist);
}

// === NEW IMPLEMENTATION START ===
// CRITICAL: Unicode 与 char 的示例。保留原始测试作为注释备份。
#[allow(dead_code)]
pub fn stdx_examples_charx() {
    // CRITICAL: char 是 Unicode 标量值，大小为 4 字节。
    let c = '中';
    let code = c as u32;

    // CRITICAL: chars() 用于遍历字符串中的 Unicode 标量值（code points）。
    let s = "é é ❤️";
    let chars: Vec<char> = s.chars().collect();
    let grapheme_count = chars.len(); // 注意：grapheme clusters 需要 external crate（unicode-segmentation）来正确计数

    // CRITICAL: bytes() 返回 UTF-8 原始字节序列，len 不同于 chars().count()
    let byte_len = s.as_bytes().len();

    // CRITICAL: 示例：从 u32 创建 char（需检查范围）
    if let Some(ch_from_u32) = std::char::from_u32(0x4E2D) {
        // AUTO_COMMENT: 0x4E2D 是 '中'
        let _ = ch_from_u32;
    }

    // AUTO_COMMENT: 避免未使用变量警告
    let _ = (code, grapheme_count, byte_len, chars);
}
// === NEW IMPLEMENTATION END ===
